home *** CD-ROM | disk | FTP | other *** search
- /* EXPR.C Dr Dobbs Sept 1985 pp 25. */
-
- #include <stdio.h>
- #include <ctype.h>
-
- static char *str;
- static int error;
-
-
- main(argc, argv)
- char **argv;
- {
- char buf[133], *bp = buf;
- int err, rval;
-
- if (argc > 2)
- {
- fprintf(stderr,"usage: expr [<expression>]");
- exit(-1);
- }
- if (argc > 1)
- {
- rval=parse(argv[1], &err);
- printf(err ? "*** ERROR ***" : "%d", rval);
- exit(rval);
- }
- printf("Enter expression or <cr> to exit program\n");
-
- while(1)
- {
- printf("? ");
- if (gets(buf) == NULL || !*buf)
- exit(0);
- rval=parse(buf, &err);
-
- if (err)
- printf("*** ERROR ***\n");
- else
- printf("%s = %d\n", buf, rval);
- }
- }
-
- int parse(expression, err)
- char *expression;
- int *err;
- {
- register int rval;
-
- error=0;
- str=expression;
- rval=expr();
- return((*err = error) ? 0 : rval);
- }
-
- static int expr()
- {
- int lval;
-
- lval=factor();
- switch (*str)
- {
- case '+' : str++; lval += expr(); break;
- case '-' : str++; lval -= expr(); break;
- case '*' : str++; lval *= expr(); break;
- case '/' : str++; lval /= expr(); break;
- default :
- }
- return(lval);
- }
-
- static int factor()
- {
- int rval = 0 , sign = 1 ;
-
- if (*str == '-')
- {
- sign = -1;
- str++;
- }
- if (*str != '(' )
- rval=constant();
- else
- {
- str++;
- rval=expr();
- if (*str == ')' )
- str++;
- else
- {
- printf("mismatched parens\n");
- error++;
- }
- }
- return(rval * sign);
- }
-
- static int constant()
- {
- int rval = 0;
-
- if (!isdigit(*str))
- error++;
- while ( *str && isdigit(*str) )
- {
- rval=(rval*10) + (*str - '0');
- str++;
- }
- return(rval);
- }